package com.wsoft.dc.service.impl;

import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wsoft.core.exception.Asserts;
import com.wsoft.dc.entity.DcConfigEntityEntity;
import com.wsoft.dc.enums.ConfigEntityTypeEnum;
import com.wsoft.dc.manager.DcConfigEntityManager;
import com.wsoft.dc.mapper.DcConfigEntityMapper;
import com.wsoft.dc.query.config.entity.ConfigEntityInsertQuery;
import com.wsoft.dc.query.config.entity.ConfigEntityListQuery;
import com.wsoft.dc.query.config.entity.ConfigEntityUpdateQuery;
import com.wsoft.dc.service.IDcConfigEntityService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 待办实体对象 服务实现类
 * </p>
 *
 * @author Z001
 * @since 2024年12月17日 16:18:19
 */
@Service
public class DcConfigEntityServiceImpl extends ServiceImpl<DcConfigEntityMapper, DcConfigEntityEntity> implements IDcConfigEntityService {

    @Resource
    private DcConfigEntityManager configEntityManager;


    @Override
    public boolean insertConfigEntity(ConfigEntityInsertQuery query) {
        //校验属性
        checkConfigAttribute(query.getConfigId(),query.getAttribute(),null);
        return configEntityManager.save(Convert.convert(DcConfigEntityEntity.class, query));
    }

    @Override
    public boolean updateConfigEntity(ConfigEntityUpdateQuery query) {
        DcConfigEntityEntity entity = configEntityManager.getById(query.getId());
        if(ConfigEntityTypeEnum.DEFAULT.getType().equals(entity.getType())){
            //默认值不允许修改
        }
        //校验属性
        checkConfigAttribute(query.getConfigId(),query.getAttribute(),query.getId());
        return configEntityManager.updateById(Convert.convert(DcConfigEntityEntity.class, query));
    }

    @Override
    public DcConfigEntityEntity getConfigEntityInfo(Long id) {
        return configEntityManager.getById(id);
    }

    @Override
    public boolean deleteConfigEntity(Long id) {
        return configEntityManager.removeById(id);
    }

    @Override
    public List<DcConfigEntityEntity> listConfigEntity(ConfigEntityListQuery query) {
        return configEntityManager.listConfigEntity(query.getConfigId());
    }


    // ################################## 私有方法  ##################################

    /**
     * 获取配置下的属性名
     * @param configId
     * @param attribute
     * @param id
     */
    private void checkConfigAttribute(Long configId,String attribute,Long id){
        DcConfigEntityEntity entity = configEntityManager.getConfigAttribute(configId,attribute);
        //新增
        if(null == id && entity != null){
            Asserts.fail("[config.module.type.exist]");
        }
        //编辑
        if(null != id && entity != null && !id.equals(entity.getId())){
            Asserts.fail("[config.module.type.exist]");
        }
    }

    /**
     * 校验key,只能存在一个
     * @param configId
     * @param id
     */
    private void checkConfigKey(Long configId,Long id){
        DcConfigEntityEntity entity = configEntityManager.getConfigKey(configId);
        //新增
        if(null == id && entity != null){
            Asserts.fail("[config.module.key.exist]");
        }
        //编辑
        if(null != id && entity != null && !id.equals(entity.getId())){
            Asserts.fail("[config.module.key.exist]");
        }
    }
}
